/**
 * @file protocol_params.h
 * @brief 
 * @author  ()
 * @version 1.0
 * @date 2024-09-13
 * @ingroup flash
 * @copyright Copyright (C) 2019 Queclink Wireless Solutions (ShenZhen) Co., Ltd. All Rights Reserved.
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2024-09-13 <td>1.0     <td>     <td>内容
 * </table>
 */
#ifndef _PROTOCOL_PARAMS_H_
#define _PROTOCOL_PARAMS_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "aadl/flash.h"
//#include "protocol.h"
//#include "config.h"  

#define  ANONYMOUS_CONN1(type, var, line)  type  var##line
#define  ANONYMOUS_CONN0(type,prefix,line)  ANONYMOUS_CONN1(type, prefix, line)
#define  ANONYMOUS_DEF(type,prefix)  ANONYMOUS_CONN0(type,prefix, __LINE__)
    
#define __params_update_reg_extend(start_id,end_id,callback)  \
ANONYMOUS_DEF(__root const params_update_manager_t,callback) \
@ "__section_params_update" = {start_id,end_id,callback}

#define __params_init_reg(id,init_handler) \
ANONYMOUS_DEF(__root const params_init_manager_t,init_handler) \
@ "__section_params_init" = {id, init_handler}

/*参数初始化管理 -------------------------------------------------------------*/
typedef struct {
    int32_t config_params_id;                                         /*参数id ---*/
    void (*init_handler)(void);
    //const char *name;
}params_init_manager_t;
/*参数更新管理 ---------------------------------------------------------------*/
typedef struct {
    unsigned short start;                                         /*参数id ---*/
    unsigned short end;                                           /*参数id ---*/
    void (*callback)(const void *new_conf, const void *old_conf);
}params_update_manager_t;

/**
 * @brief 配置参数ID
 */
typedef enum
{
    CONFIG_ID_SN = 0,   /*设备序列号*/
    CONFIG_ID_APN,      /*apn*/
    CONFIG_ID_LOG,      /*日志等级*/
    CONFIG_ID_PLAT,     /*平台参数*/
    CONFIG_ID_MAIN_IP,  /*客户服务器参数*/
    CONFIG_ID_TEST_IP,  /*测试服务器参数*/

    CONFIG_ID_TOTAL
}config_id;

extern struct flash_data config_params_table[CONFIG_ID_TOTAL];


/*
 * @brief     注册配置参数更新处理
 * @params    id        配置参数id(参考config_id定义)
 * @params    callback  参数更新回调函数
 *            类型:void (*callback)(const void *new_conf, const void *old_conf))
 *            其中new_conf - 表示最新配置, old_conf - 先前的配置
 */
#define config_update_callback_register(id, callback)\
        __params_update_reg_extend(id,id,callback);
/*
 * @brief     注册配置参数更新处理
 * @params    start_id  配置参数开始id(参考config_id定义)
 * @params     end_id    配置参数结束id(参考config_id定义)        
 * @params    callback  参数更新回调函数
 *            类型:void (*callback)(const void *new_conf, const void *old_conf))
 *            其中new_conf - 表示最新配置, old_conf - 先前的配置
 */
#define config_update_callback_register_extend(start_id,end_id, callback)\
        __params_update_reg_extend(start_id,end_id,callback);
        
/*
 * @brief     注册配置参数初始化处理
 * @params    id        配置参数id(参考config_id定义)
 * @params    callback  参数更新回调函数
 *            类型:void (*init_handler)(void))
 */
#define params_init_handler_register(id, init_handler)\
        __params_init_reg(id,init_handler);

/*参数初始化 ----------------------------------------------------------------*/
void config_params_init(void);

/*参数更新总入口 -------------------------------------------------------------*/
void config_update_with_callback(config_id id, const void *new_conf,
                                    const void *old_conf);






int32_t config_set(config_id id, const void *conf); /*设置配置参数*/
int32_t config_get(config_id id, void *conf);       /*获取配置参数*/

extern int32_t config_backup_set(config_id id, const void *conf);
extern int32_t config_backup_get(config_id id, void *conf);


#ifdef __cplusplus
}
#endif

#endif
